package com.seata.order.errHandler;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/****************************************************
 * 通过 ControllerAdvice 统一处理异常
 * ControllerAdvice 处理异常的顺序：粒度越小越先处理，若controller包中的异常没有匹配到 @ExceptionHandler 指定
 *                                                        的异常，则匹配最大粒度的异常
 *
 * ControllerAdvice 只能处理 Controller 层面的异常
 *
 * @author lbf
 * @date 2025/8/4 13:47
 ****************************************************/
@RestControllerAdvice(basePackages = {"com.seata.order.controller"})
public class ExceptionControllerAdviceHandler {

    /**
     * 处理 RuntimeException 异常，并把处理后的异常信息返回给前台
     *
     * 测试：seata 分布式事务应用中，Order 调用 Stock ，当使用 ControllerAdvice 处理了Order controller的异常，异常没有抛出去时，此时 Stock 和 Order的事务都会回滚
     *           因为，是在 order service 调用的 stock，order service 中抛出异常已经通知 stock 回滚分支事务。
     *           若 在 order service 中处理了异常（即异常不抛出），则 order 和 stock 的事务都不会回滚，都会正常提交事务
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = RuntimeException.class)
    public String RuntimeExceptionHandler(RuntimeException e){

        System.out.println(" ExceptionControllerAdviceHandler--order：创建订单失败~~~！");

        return "200";
    }

    @ExceptionHandler(value = Throwable.class)
    public String exception(Throwable e){

        System.out.println(" 处理最大粒度的异常~~~~~~");

        return "200";
    }
}
